import 'dart:async';

import 'package:flutter/material.dart';

// 倒计时按钮
class GwGetCodeView extends StatefulWidget {
  /// 倒计时的秒数，默认60秒。
  final int seconds;

  /// 用户点击时的回调函数。
  final Function onTapCallback;

  /// 是否可以获取验证码，默认为`false`。
  final bool available;

  final EdgeInsetsGeometry padding;

  GwGetCodeView(
      {Key? key,
      this.seconds = 60,
      this.padding = EdgeInsets.zero,
      this.available = false,
      required this.onTapCallback})
      : super(key: key);

  @override
  State<GwGetCodeView> createState() => _GwGetCodeViewState();
}

class _GwGetCodeViewState extends State<GwGetCodeView> {
  final TextStyle _normalStyle =
      const TextStyle(fontSize: 16.0, color: Color(0xFF00CACE));

  final TextStyle _sendStyle =
      const TextStyle(fontSize: 16.0, color: Colors.grey);

  /// 倒计时的计时器。
  Timer? _timer;

  /// 当前倒计时的秒数。
  int _seconds = 0;

  /// 字体样式。
  TextStyle? inkWellStyle;

  /// 文本。
  String _verifyStr = '获取验证码';

  @override
  void initState() {
    super.initState();
    _seconds = widget.seconds;
    inkWellStyle = _normalStyle;
  }

  @override
  void dispose() {
    _cancelTimer();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
        padding: widget.padding,
        child: widget.available
            ? InkWell(
                onTap: (_seconds == widget.seconds)
                    ? () {
                        _startTimer();
                        inkWellStyle = _sendStyle;
                        _verifyStr = '已发送$_seconds' + 's';
                        setState(() {});
                        widget.onTapCallback();
                      }
                    : null,
                child: Container(
                  padding:
                      const EdgeInsets.symmetric(horizontal: 5, vertical: 8),
                  decoration: BoxDecoration(
                      border: Border.all(color: Colors.blue),
                      borderRadius: const BorderRadius.all(Radius.circular(5))),
                  child: Text('  $_verifyStr  ', style: inkWellStyle),
                ))
            : InkWell(
                child: Container(
                padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8),
                decoration: BoxDecoration(
                    border: Border.all(color: Colors.blue),
                    borderRadius: const BorderRadius.all(Radius.circular(5))),
                child: Text('  获取验证码  ', style: _sendStyle),
              )));
  }

  /// 启动倒计时的计时器。
  void _startTimer() {
    /// 计时器（`Timer`）组件的定期（`periodic`）构造函数，创建一个新的重复计时器。
    _timer = Timer.periodic(const Duration(seconds: 1), (timer) {
      if (_seconds == 0) {
        _cancelTimer();
        _seconds = widget.seconds;
        inkWellStyle = _normalStyle;
        setState(() {});
        return;
      }
      _seconds--;
      _verifyStr = '已发送$_seconds' + 's';
      setState(() {});
      if (_seconds == 0) {
        _verifyStr = '重新发送';
      }
    });
  }

  /// 取消倒计时的计时器。
  void _cancelTimer() {
    // 计时器（`Timer`）组件的取消（`cancel`）方法，取消计时器。
    _timer?.cancel();
  }
}
